#ifndef _SHELL_H
#define _SHELL_H

#ifdef  __cpluscplus
extern "C" {
#endif

#define _CL_TTY_PROMPT_1_  "\n\nzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"     
#define _CL_TTY_PROMPT_2_  "\nzz       zzz  zzzzzzzzzzzzzzzzzzzzz  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
#define _CL_TTY_PROMPT_3_  "\nzz  zzzzz  z  zzzzzzzzzzzzzzzzzzzzz  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
#define _CL_TTY_PROMPT_4_  "\nzz  zzzzzzzz  zzzzzzzzzzzzzzzzzzzzz  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
#define _CL_TTY_PROMPT_5_  "\nzz      zzzz     zzzz     zz  zz  z      zzzz    zzzz   z  zzz     zzz"
#define _CL_TTY_PROMPT_6_  "\nzz  zzzzz  z  zz  zz  zzz  z  z  zz  zzz  zz  zz  zz  z  z  z  zzz  zz"
#define _CL_TTY_PROMPT_7_  "\nzz  zzzzz  z  zzz  z      zz   zzzz  zzz  z  zzzz  z  z  z  z      zzz"
#define _CL_TTY_PROMPT_8_  "\nzz  zzzzz  z  zz  zz  zzzzzz  zzzzz  zzz  zz  zz  zz  z  z  z  zzzzzzz"
#define _CL_TTY_PROMPT_9_  "\nzz  zzzzz  z     zzzz      z  zzzzz  zzz  zzz    zzz  z  z  zz      zz"
#define _CL_TTY_PROMPT_10_ "\nzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\n"
#define _CL_TTY_PROMPT_ _CL_TTY_PROMPT_1_ _CL_TTY_PROMPT_2_ _CL_TTY_PROMPT_3_ _CL_TTY_PROMPT_4_ _CL_TTY_PROMPT_5_ _CL_TTY_PROMPT_6_ _CL_TTY_PROMPT_7_ _CL_TTY_PROMPT_8_ _CL_TTY_PROMPT_9_ _CL_TTY_PROMPT_10_


#define SHELL_HISTORY_EN        0
#define SHELL_USE_OS            1


#ifndef NULL
#define NULL            ((void *)0)
#endif

#define SH_TRUE         0
#define SH_FALSE        -1


#define SHELL_OK        0
#define SHELL_ERROR     -1

#define IO_EOF          -1

typedef struct shell_command_struct{
   char     name[20];
   int     (*shell_func)(int argc, char *argv[]);
   char     doc[20];
} SHELL_COMMAND_STRUCT; 

#define SHELL_MAX_ARGS          14              // 参数最大个数

#define SHELL_MAX_CMDLEN        80

typedef struct _shell_context {
   char*                argv[SHELL_MAX_ARGS];
   int                  argc;
   char                 cmd_line[SHELL_MAX_CMDLEN];
#if (1 == SHELL_HISTORY_EN)
   char                 history[SHELL_MAX_CMDLEN];
#endif
   SHELL_COMMAND_STRUCT *command_list_prt;
   signed char          exit_flag; 
} SHELL_CONTEXT, *SHELL_CONTEXT_PTR;


extern  SHELL_COMMAND_STRUCT shell_commands[];
extern SHELL_CONTEXT   shell_context;

extern int shell_init(void);
extern int shell_start(const SHELL_COMMAND_STRUCT   *shell_commands);

int _io_atoi(const char *str);
int _io_getline(char* str_ptr, int max_length);


#ifdef  __cpluscplus
}
#endif

#endif

